/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package View.components;

import Algorithm.Algoritmo;
import Model.AccionXPerfil;
import Principals.Constantes;
import Principals.Main;
import View.maestros.Frm_BuscarEmpleado;
import View.maestros.Frm_BuscarVehiculo;
import View.planificacion.Frm_AdministrarIncidentes;
import View.planificacion.Frm_Mapa;
import View.planificacion.Frm_MonitorearPedidos;
import View.planificacion.Frm_PlanificarPedidos;
import View.planificacion.Frm_Simulacion;
import View.seguridad.*;
import View.ventas.Frm_BuscarProducto;
import View.ventas.Frm_BuscarCliente;
import View.ventas.Frm_BuscarPedido;
import View.reportes.Frm_ReporteEnvios;
import View.reportes.Frm_ReporteClientesyPedidos;
import View.reportes.Frm_ReporteEnviosxEmpleado;
import View.reportes.Frm_ReporteEnviosRetrasados;
import View.reportes.Frm_ReportePagosxChofer;
import View.reportes.Frm_ReporteHorasExtras;
import View.reportes.Frm_ReporteRentabilidad;
import View.reportes.Frm_ReporteSeguridad;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.Iterator;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;
import static javax.swing.WindowConstants.HIDE_ON_CLOSE;

/**
 *
 * @author walter
 */
public final class Index extends JFrame {

    private JDesktopPane container;
    private JDesktopPane internal;
    JInternalFrame accion;
    private JMenuBar mbMenu;
    private JMenu mnCuenta;
    private JMenu mnMaestros;
    private JMenu mnVentas;
    private JMenu mnReportes;
    private JMenu mnPlanificacion;
    private JMenu mnSeguridad;
    private JMenu mnConfiguracion;
    private JMenuItem mniAdministrarPerfiles;
    private JMenuItem mniSalirSistema;
    private JMenuItem mniCambiarContrasenha;
    private JMenuItem mniCerrarSesion;
    private JMenuItem mniBuscarEmpleado;
    private JMenuItem mniProducto;
    private JMenuItem mniCliente;
    private JMenuItem mniPedido;
    private JMenuItem mniMonitorearPedidos;
    private JMenuItem mniAdministrarIncidentes;
    private JMenuItem mniPlanificarPedidos;
    private JMenuItem mniSimulacion;
    private JMenuItem mniMapa;
    private JMenuItem mniVehiculos;
    private JMenuItem mniVariableSistema;
    private JMenuItem mniRepEnvios;
    private JMenuItem mniRepClientesyPedidos;
    private JMenuItem mniRepEnviosxEmpleado;
    private JMenuItem mniRepEnviosRetrasados;
    private JMenuItem mniRepPagosxChofer;
    private JMenuItem mniRepHorasExtras;
    private JMenuItem mniRepSeguridad;
    private JMenuItem mniRepRentabilidad;
    private JMenuItem mniRepSimulacion;

    public Index() {
        initComponents();
    }

    public Index(JDesktopPane panel) {
        initComponents();
        changeDesktopPane(panel);
    }

    public void initComponents() {
        Main.genetico = new Algoritmo();

        // container 
        container = new JDesktopPane();
        internal = new JDesktopPane();

        // Barra menu
        mbMenu = new JMenuBar();

        // MENU CUENTA
        mnCuenta = new JMenu();
        mniSalirSistema = new JMenuItem();
        mniCambiarContrasenha = new JMenuItem();
        mniCerrarSesion = new JMenuItem();

        //MENU SEGURIDAD
        mnSeguridad = new JMenu();
        mniAdministrarPerfiles = new JMenuItem();

        //MENU CONFIGURACION
        mnConfiguracion = new JMenu();
        mniVariableSistema = new JMenuItem();

        // MENU MAESTROS
        mnMaestros = new JMenu();
        mniBuscarEmpleado = new JMenuItem();
        mniVehiculos = new JMenuItem();
        mniVariableSistema = new JMenuItem();

        // MENU PLANIFICACION
        mnPlanificacion = new JMenu();
        mniMonitorearPedidos = new JMenuItem();
        mniAdministrarIncidentes = new JMenuItem();
        mniPlanificarPedidos = new JMenuItem();
        mniMapa = new JMenuItem();
        mniSimulacion = new JMenuItem();

        // MENU VENTAS
        mnVentas = new JMenu();
        mniProducto = new JMenuItem();
        mniCliente = new JMenuItem();
        mniPedido = new JMenuItem();

        // MENU REPORTES
        mnReportes = new JMenu();
        mniRepEnvios = new JMenuItem();
        mniRepClientesyPedidos = new JMenuItem();
        mniRepEnviosxEmpleado = new JMenuItem();
        mniRepEnviosRetrasados = new JMenuItem();
        mniRepPagosxChofer = new JMenuItem();
        mniRepHorasExtras = new JMenuItem();
        mniRepSeguridad = new JMenuItem();
        mniRepRentabilidad = new JMenuItem();
        mniRepSimulacion = new JMenuItem();

        mnCuenta.setText("Mi cuenta"); // <--------------------------------------------- MENU CUENTA
        mniCambiarContrasenha.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_H, InputEvent.ALT_MASK));
        mniCambiarContrasenha.setText("Cambiar contraseña");
        mniCambiarContrasenha.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniCambiarContrasenhaActionPerformed(evt);
            }
        });

        mniCerrarSesion.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_O , InputEvent.ALT_MASK ) ) ;
        mniCerrarSesion.setText("Cerrar sesión");
        mniCerrarSesion.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniCerrarSesionActionPerformed(evt);
            }
        });

        mniSalirSistema.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_X , InputEvent.ALT_MASK ) ) ;
        mniSalirSistema.setText("Salir del sistema");
        mniSalirSistema.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniSalirSistemaActionPerformed(evt);
            }
        });

        mnCuenta.add(mniCambiarContrasenha);
        mnCuenta.add(mniCerrarSesion);
        mnCuenta.add(mniSalirSistema);

        mnMaestros.setText("Administración"); // <--------------------------------------- MENU MAESTROS
        mniBuscarEmpleado.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_E , InputEvent.ALT_MASK ) ) ;
        mniBuscarEmpleado.setText("Empleado");
        mniBuscarEmpleado.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniBuscarEmpleadoActionPerformed(evt);
            }
        });

        mniVehiculos.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_V , InputEvent.ALT_MASK ) ) ;
        mniVehiculos.setText("Vehículos");
        mniVehiculos.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniVehiculoActionPerformed(evt);
            }
        });

        mnMaestros.add(mniBuscarEmpleado);
        mnMaestros.add(mniVehiculos);

        mnPlanificacion.setText("Planificación");  // <--------------------------------------- MENU PLANIFICACION
        mniMonitorearPedidos.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_T , InputEvent.ALT_MASK ) ) ;
        mniMonitorearPedidos.setText("Monitorear Pedidos");
        mniMonitorearPedidos.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniMonitorearPedidosActionPerformed(evt);
            }
        });

        mniPlanificarPedidos.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_P , InputEvent.ALT_MASK ) ) ;
        mniPlanificarPedidos.setText("Planificar Pedidos");
        mniPlanificarPedidos.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniPlanificarPedidosActionPerformed(evt);
            }
        });

        mniMapa.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_M , InputEvent.ALT_MASK ) ) ;
        mniMapa.setText("Mapa");
        mniMapa.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniMapaActionPerformed(evt);
            }
        });

        mniSimulacion.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_S , InputEvent.ALT_MASK ) ) ;
        mniSimulacion.setText("Simulación");
        mniSimulacion.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniSimulacionActionPerformed(evt);
            }
        });

        mnPlanificacion.add(mniMonitorearPedidos);
        mnPlanificacion.add(mniPlanificarPedidos);
        mnPlanificacion.add(mniMapa);
        mnPlanificacion.add(mniSimulacion);

        mnVentas.setText("Ventas"); // <--------------------------------------------- MENU VENTAS
        mniProducto.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_R , InputEvent.ALT_MASK ) ) ;
        mniProducto.setText("Productos");
        mniProducto.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniProductoActionPerformed(evt);
            }
        });

        mniCliente.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_L , InputEvent.ALT_MASK ) ) ;
        mniCliente.setText("Clientes");
        mniCliente.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniClienteActionPerformed(evt);
            }
        });
        
        mniPedido.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_D , InputEvent.ALT_MASK ) ) ;
        mniPedido.setText("Pedidos");
        mniPedido.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniPedidoActionPerformed(evt);
            }
        });
        
        mnVentas.add(mniProducto);
        mnVentas.add(mniCliente);
        mnVentas.add(mniPedido);

        mnReportes.setText("Reportes"); // <--------------------------------------------- MENU REPORTES
        mniRepEnvios.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_1 , InputEvent.ALT_MASK ) ) ;
        mniRepEnvios.setText("Envios de pedidos");
        mniRepEnvios.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniRepEnviosActionPerformed(evt);
            }
        });

        mniRepEnviosRetrasados.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_2 , InputEvent.ALT_MASK ) ) ;
        mniRepEnviosRetrasados.setText("Envios Atrasados");
        mniRepEnviosRetrasados.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniRepEnviosRetrasadosActionPerformed(evt);
            }
        });

        mniRepSeguridad.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_3 , InputEvent.ALT_MASK ) ) ;
        mniRepSeguridad.setText("Seguridad");
        mniRepSeguridad.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniRepSeguridadActionPerformed(evt);
            }
        });

        mniRepRentabilidad.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_4 , InputEvent.ALT_MASK ) ) ;
        mniRepRentabilidad.setText("Rentabilidad de envios");
        mniRepRentabilidad.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniRepRentabilidadActionPerformed(evt);
            }
        });
        
        mniRepSimulacion.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_5 , InputEvent.ALT_MASK ) ) ;
        mniRepSimulacion.setText("Simulacion");
        mniRepSimulacion.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniRepSimulacionActionPerformed(evt);
            }
        });

        mnReportes.add(mniRepEnvios);
        mnReportes.add(mniRepEnviosRetrasados);
        mnReportes.add(mniRepSeguridad);
        mnReportes.add(mniRepRentabilidad);
        mnReportes.add(mniRepSimulacion);

        mnSeguridad.setText("Seguridad"); // <--------------------------------------------- MENU SEGURIDAD
        mniAdministrarPerfiles.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_A , InputEvent.ALT_MASK ) ) ;
        mniAdministrarPerfiles.setText("Perfiles");
        mniAdministrarPerfiles.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniAdministrarPerfilesActionPerformed(evt);
            }
        });
        mnSeguridad.add(mniAdministrarPerfiles);
        // ----------------------------------------------

        mnConfiguracion.setText("Configuración"); // <--------------------------------------------- MENU CONFIGURACION
        mniVariableSistema.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_B , InputEvent.ALT_MASK ) ) ;
        mniVariableSistema.setText("Variables del sistema");
        mniVariableSistema.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mniVariableSistemaActionPerformed(evt);
            }
        });
        mnConfiguracion.add(mniVariableSistema);

        // ----------------------------------------------

        mbMenu.add(mnCuenta);
        mbMenu.add(mnMaestros);
        mbMenu.add(mnPlanificacion);
        mbMenu.add(mnVentas);
        mbMenu.add(mnSeguridad);
        mbMenu.add(mnConfiguracion);
        mbMenu.add(mnReportes);

        Iterator i = Main.usr.getPerfil().getAccionXPerfils().iterator();
        while (i.hasNext()) {
            AccionXPerfil axp = (AccionXPerfil) i.next();
            if (axp.getEstado() == 0) {
                switch (axp.getId().getIdAccion()) {
                    case Constantes.EMPLEADO:
                        mniBuscarEmpleado.setEnabled(false);
                        break;
                    case Constantes.VEHICULOS:
                        mniVehiculos.setEnabled(false);
                        break;
                    case Constantes.MONITOREAR_PEDIDOS:
                        mniMonitorearPedidos.setEnabled(false);
                        break;
                    case Constantes.PLANIFICAR_PEDIDOS:
                        mniPlanificarPedidos.setEnabled(false);
                        break;
                    case Constantes.MAPA:
                        mniMapa.setEnabled(false);
                        break;
                    case Constantes.SIMULACION:
                        mniSimulacion.setEnabled(false);
                        break;
                    case Constantes.PRODUCTOS:
                        mniProducto.setEnabled(false);
                        break;
                    case Constantes.CLIENTES:
                        mniCliente.setEnabled(false);
                        break;
                    case Constantes.PEDIDOS:
                        mniPedido.setEnabled(false);
                        break;
                    case Constantes.ADMINISTRAR_PERFILES:
                        mniAdministrarPerfiles.setEnabled(false);
                        break;
                    case Constantes.VARIABLES_SISTEMA:
                        mniVariableSistema.setEnabled(false);
                        break;
                    case Constantes.ENVIOS_PEDIDOS:
                        mniRepEnvios.setEnabled(false);
                        break;
                    case Constantes.ENVIOS_RETRASADOS:
                        mniRepEnviosRetrasados.setEnabled(false);
                        break;
                    case Constantes.SEGURIDAD:
                        mniRepSeguridad.setEnabled(false);
                        break;
                    case Constantes.RENTABILIDAD_ENVIOS:
                        mniRepRentabilidad.setEnabled(false);
                        break;
                    case Constantes.REP_SIMULACION:
                        mniRepSimulacion.setEnabled(false);
                        break;
                }
            }
        }

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("DP1");

        setJMenuBar(mbMenu);
        setResizable(false);

        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(d.width / 2, d.height / 2);
        this.setLocation(0, 0);
//        setSize(d.width, d.height);
//        this.setLocation((int) d.getWidth() / 2 - (int) this.getPreferredSize().getWidth() / 2,
//                (int) d.getHeight() / 8 - (int) this.getPreferredSize().getHeight() / 8);
        this.setExtendedState(Frame.MAXIMIZED_BOTH);
        this.setUndecorated(true);
    }

    // <editor-fold defaultstate="collapsed" desc="Eventos">
    private void mniBuscarEmpleadoActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarEmpleado());
    }

    private void mniCerrarSesionActionPerformed(java.awt.event.ActionEvent evt) {
        new Login().setVisible(true);
        this.dispose();
    }

    private void mniSalirSistemaActionPerformed(java.awt.event.ActionEvent evt) {
        System.exit(0);
    }

    private void mniCambiarContrasenhaActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_CambiarContrasenha());
    }

    private void mniMonitorearPedidosActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_MonitorearPedidos());
    }

    private void mniAdministrarIncidentesActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_AdministrarIncidentes());
    }

    private void mniPlanificarPedidosActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_PlanificarPedidos());
    }

    private void mniMapaActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_Mapa());
    }

    private void mniSimulacionActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_Simulacion());
    }

    private void mniProductoActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarProducto());
    }

    private void mniClienteActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarCliente());
    }

    private void mniPedidoActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarPedido());
    }

    private void mniAdministrarPerfilesActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarPerfil());
    }

    private void mniAdministrarVariablesSistemaActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarVariableSistema());
    }

    private void mniVehiculoActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarVehiculo());
    }

    private void mniVariableSistemaActionPerformed(java.awt.event.ActionEvent evt) {
        changeDesktopPane(new Frm_BuscarVariableSistema());
    }

    private void mniRepEnviosActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReporteEnvios());
    }

    private void mniRepClientesyPedidosActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReporteClientesyPedidos());
    }

    private void mniRepEnviosxEmpleadoActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReporteEnviosxEmpleado());
    }

    private void mniRepEnviosRetrasadosActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReporteEnviosRetrasados());
    }

    private void mniRepSimulacionActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReportePagosxChofer());
    }

    private void mniRepPagosxChoferActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReportePagosxChofer());
    }

    private void mniRepHorasExtrasActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReporteHorasExtras());
    }

    private void mniRepSeguridadActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReporteSeguridad());
    }

    private void mniRepRentabilidadActionPerformed(ActionEvent evt) {
        changeDesktopPane(new Frm_ReporteRentabilidad());
    }

    // </editor-fold>
    public void addContentPane(JPanel panel) {
        //content panes must be opaque
        panel.setOpaque(true);
        this.getContentPane().add(panel);
        pack();
    }

    public void changeContentPane(JPanel panel) {
        this.getContentPane().removeAll();
        // Pass the frame f reference only into MainDisplay, it doesn't actually do anything apart from allowing a class to add a JMenuBar on the JFrame.
        this.getContentPane().invalidate();
        this.getContentPane().validate();
        this.getContentPane().repaint();
        // this.remove(this.getContentPane()) ;
        this.addContentPane(panel);
        pack();
    }

    public void changeDesktopPane(JDesktopPane panel) {
        if (panel.getClass().toString().equals("class View.components.JFrame")) {
            try {
                this.getContentPane().removeAll();
                this.getContentPane().invalidate();
                this.getContentPane().validate();
                this.getContentPane().repaint();

                panel.setOpaque(true);
                this.container = panel;

                this.getContentPane().add(panel);

                pack();

                Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
                setSize(d.width, d.height);
            } catch (Exception e) {
            }
        } else {
            this.container = panel;
            internal = new JDesktopPane();
            internal.setSize(this.getWidth(), this.getHeight());
            this.getContentPane().removeAll();
            this.getContentPane().add(internal);
            this.getContentPane().invalidate();
            this.getContentPane().validate();
            this.getContentPane().repaint();

            accion = new JInternalFrame();
            internal.add(accion);
            accion.setDoubleBuffered(true);
            accion.add(panel);
            accion.pack();
            accion.setDefaultCloseOperation(HIDE_ON_CLOSE);
            accion.setLocation((this.getWidth() - panel.getWidth()) / 2, (this.getHeight() - panel.getHeight()) / 4);
            accion.setVisible(true);

            pack();

            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
            setSize(d.width, d.height);
        }
    }

    public JDesktopPane getContainer() {
        return container;
    }
}
